package net.loyin.utils.mail;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.log4j.Logger;

/**
 * 简单邮件（不带附件的邮件）发送器
 */
public class SimpleMailSender {
	private static Logger logger=Logger.getLogger(SimpleMailSender.class);
/**
 * 以文本格式发送邮件
 * @param mailInfo 待发送的邮件的信息
 *//*
    public boolean sendTextMail(MailSenderInfo mailInfo) {
	  // 判断是否需要身份认证 
	  MyAuthenticator authenticator = null; 
	  Properties pro = mailInfo.getProperties();
	  if (mailInfo.isValidate()) { 
	  // 如果需要身份认证，则创建一个密码验证器 
		authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); 
	  }
	  // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
	  Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 
	  try { 
	  // 根据session创建一个邮件消息 
	  Message mailMessage = new MimeMessage(sendMailSession); 
	  // 创建邮件发送者地址 
	  Address from = new InternetAddress(mailInfo.getFromAddress()); 
	  // 设置邮件消息的发送者 
	  mailMessage.setFrom(from); 
	  // 创建邮件的接收者地址，并设置到邮件消息中 
	  Address to = new InternetAddress(mailInfo.getToAddress()); 
	  mailMessage.setRecipient(Message.RecipientType.TO,to); 
	  // 设置邮件消息的主题 
	  mailMessage.setSubject(mailInfo.getSubject()); 
	  // 设置邮件消息发送的时间 
	  mailMessage.setSentDate(new Date()); 
	  // 设置邮件消息的主要内容 
	  String mailContent = mailInfo.getContent(); 
	  mailMessage.setText(mailContent); 
	  
	  // 发送邮件 
	  Transport.send(mailMessage);
	  return true; 
	  } catch (MessagingException ex) { 
		  ex.printStackTrace(); 
	  } 
	  return false; 
	} 
	*/

    /**
     * 以HTML格式发送邮件
     * @param mailInfo 待发送的邮件信息
     */
    public void sendHtmlMail(MailSenderInfo mailInfo) {
    	logger.info("开始发送邮件");
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
     // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession=null;
        //如果需要身份认证，则创建一个密码验证器
        if (mailInfo.isAuth==true) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
            sendMailSession = Session.getDefaultInstance(pro, authenticator);
        }else{
        	sendMailSession = Session.getDefaultInstance(pro);
        }
        sendMailSession.setDebug(true);
        sendMailSession.setDebugOut(System.out);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址，并设置到邮件消息中
            Address[] tolist = new Address[mailInfo.toAddress.length];
            int i = 0;
            for (String add : mailInfo.toAddress) {
                tolist[i++] = new InternetAddress(add);
            }
            //接收人地址
            mailMessage.setRecipients(Message.RecipientType.TO, tolist);
            //抄送人地址
            if (mailInfo.ccAddress != null && mailInfo.ccAddress.length > 0) {
                Address[] cclist = new Address[mailInfo.ccAddress.length];
                i = 0;
                for (String add : mailInfo.ccAddress) {
                    cclist[i++] = new InternetAddress(add);
                }
                mailMessage.setRecipients(Message.RecipientType.CC, cclist);
            }
            //密抄送人地址
            if (mailInfo.bccAddress != null && mailInfo.bccAddress.length > 0) {
                Address[] bcclist = new Address[mailInfo.bccAddress.length];
                i = 0;
                for (String add : mailInfo.bccAddress) {
                    bcclist[i++] = new InternetAddress(add);
                }
                mailMessage.setRecipients(Message.RecipientType.BCC, bcclist);
            }
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.addHeader("Content-Type", "text/html; charset=utf-8");
            html.setContent(mailInfo.getContent(), "text/html;charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            //附件
            String[] files = mailInfo.attachFileNames;
            if (files != null && files.length > 0) {
                for (String f : files) {
                    // 建立第二部分：附件
                    html = new MimeBodyPart();
                    // 获得附件
                    DataSource source = new FileDataSource(f);
                    //设置附件的数据处理器
                    html.setDataHandler(new DataHandler(source));
                    // 设置附件文件名
                    html.setFileName(f);
                    // 加入第二部分
                    mainPart.addBodyPart(html);
                }
            }
            // 发送邮件
            Transport.send(mailMessage);
            logger.info("发送邮件完成");
        } catch (MessagingException ex) {
        	logger.error("发送邮件异常",ex);
        }
    }
} 

